package FrameWork.Event;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 事件基类
 * @param <T> 表示处理器的类型
 */
public abstract class Trigger<T extends EventHandler> {


    /**
     * 注册到该触发器的所有处理器
     */
    private final List<T> eventHandlers = new LinkedList<>();

    /**
     * 根据priority的顺序进行有序的注册，如果没有@Priority修饰，默认使用{@link Priority#NORMAL_PRIORITY}
     * 由{@link TriggerManager#safeRegisterEventHandler(Class, EventHandler)}  }进行注册
     * @param handler  具体的事件处理器
     */
    void registerHandler(final T handler) {
        int idx = 0;
        Class<? extends EventHandler> target = handler.getClass();
        for (EventHandler src:eventHandlers){
            if (isHigherPriority(target,src.getClass())){
                break;
            }
            idx++;
        }
        eventHandlers.add(idx,handler);
    }

    /**
     * @return 当前事件的所有事件处理器
     */
    protected List<T> getEventHandlers() {
        return eventHandlers;
    }

    /**
     * target的优先级是否比src高
     * @param target 当前的事件处理器
     * @param src 待比较的事件处理器
     * @return 若target优先级比src高返回true，否则false
     */
    private boolean isHigherPriority(final Class<? extends EventHandler> target,final Class<? extends EventHandler> src){
        return TriggerReflectUtil.getEventHandlerOrder(target) >= TriggerReflectUtil.getEventHandlerOrder(src);
    }
}
